package cn.wolfcode.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.util.RequiredPermission;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

// 权限拦截器
public class PermissionInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1.获取当前登录用户,从session的会话作用域中获取员工信息
        Employee employee = (Employee) request.getSession().getAttribute("USER_IN_SESSION");
        // 2.判断是否为超级管理员
        if (employee.isAdmin()) {
            // 是 --> 放行
            return true;
        }
        // 不是 --> 3
        // 3.判断请求的目标方法,因为handler这个类返回的对象是object类型无法调用方法,需要强转成它的子类才能调用方法
        HandlerMethod method = (HandlerMethod) handler;
        // 判断method是否贴有注解
        RequiredPermission annotation = method.getMethodAnnotation(RequiredPermission.class);
        // 4.判断方法上是否有贴自定义注解
        if (annotation == null) {
            // 没有 -->放行
            return true;
        }
        // 是 --> 5
        // 5.从注解上获取权限表达式
        String expression = annotation.expression();
        //6. 获取当前登录用户拥有的权限列表
        List<String> list = (List<String>) request.getSession().getAttribute("EXPRESSION_IN_SESSION");

        // 判断是否存在用户的权限
        if (list.contains(expression)) {
            return true; // 放行
        }
        // 没有,跳转到没有权限的提示页面
        request.getRequestDispatcher("/WEB-INF/views/common/nopermission.jsp").forward(request,response);
        return false;
    }
}
